﻿using BusinessLogicLayer;
using Equin.ApplicationFramework;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PresentationLayer
{
    public delegate void CapNhatTangCa(LoaiHanhDong hd, TangCa np);
    public partial class frmTangCa : Form
    {
        private LoaiHanhDong loaihanhdong;
        private TangCa TangCaCapNhat = null;
        private CapNhatTangCa capnhat;
        private TangCaManager manager = new TangCaManager();
        private List<DKTangCa> DSDK = new List<DKTangCa>();
        public frmTangCa(LoaiHanhDong loaihanhdong, CapNhatTangCa capnhat, TangCa tc)
        {
            InitializeComponent();
            this.loaihanhdong = loaihanhdong;
            this.capnhat = capnhat;
            this.TangCaCapNhat = tc;
            if(tc!=null)
                DSDK = tc.DsDKTangCa;
            dgvDSDangKy.AutoGenerateColumns = false;
        }

        private void LoadForm()
        {
            switch (loaihanhdong)
            {
                case LoaiHanhDong.Them:
                    this.Text = "Thêm tăng ca";
                    DSDK = new List<DKTangCa>();
                    dgvDSDangKy.DataSource = null;
                    dtiNgayBatDau.Value = DateTime.Today;
                    dtiNgayKetThuc.Value = dtiNgayBatDau.Value.AddDays(1);
                    DateTime giobd = new DateTime(1993, 10, 30, 17, 00, 00, 00);
                    DateTime giokt = new DateTime(1993, 10, 30, 20, 30, 00, 00);
                    dtiGioBatDau.Value = giobd;
                    dtiGioKetThuc.Value = giokt;
                    txtMaTangCa.Text = manager.LayMaMoi();
                    break;
                case LoaiHanhDong.CapNhat:
                    this.Text = "Cập nhật tăng ca";
                    dgvDSDangKy.DataSource = new BindingListView<DKTangCa>(TangCaCapNhat.DsDKTangCa);
                    dtiNgayBatDau.Value = TangCaCapNhat.NgayBD;
                    dtiNgayKetThuc.Value = TangCaCapNhat.NgayKT;
                    dtiGioBatDau.Value = TangCaCapNhat.GioBatDau;
                    dtiGioKetThuc.Value = TangCaCapNhat.GioKetThuc;
                    txtMaTangCa.Text = TangCaCapNhat.MaTangCa;
                    break;
            }
        }

        private void frmTangCa_Load(object sender, EventArgs e)
        {
            LoadForm();
        }

        TangCa LayThongTinForm()
        {
            TangCa tangca = new TangCa();
            tangca.MaTangCa = txtMaTangCa.Text;
            tangca.NgayBD = dtiNgayBatDau.Value;
            tangca.NgayKT = dtiNgayKetThuc.Value;
            tangca.GioBatDau = dtiGioBatDau.Value;
            tangca.GioKetThuc = dtiGioKetThuc.Value;
            return tangca;
        }

        bool CheckValidated()
        {
            if (dtiNgayBatDau.Value >= dtiNgayKetThuc.Value)
            {
                MessageBox.Show("Ngày bắt đầu lớn hơn ngày kết thúc!!!","Thông báo",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                dtiNgayBatDau.Focus();
                return false;
            }
            if (dtiGioBatDau.Value >= dtiGioKetThuc.Value)
            {
                MessageBox.Show("Giờ bắt đầu lớn hơn giờ kết thúc!!!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                dtiGioBatDau.Focus();
                return false;
            }
            return true;
        }

        private bool CheckDateValidated()
        {
            if (dtiNgayBatDau.Value > TangCaCapNhat.NgayBD || dtiNgayKetThuc.Value < TangCaCapNhat.NgayKT)
                return false;
            return true;
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            if (CheckValidated())
            {
                switch (loaihanhdong)
                {
                    case LoaiHanhDong.Them:
                        TangCa tc = LayThongTinForm();
                        ActionResult rs = manager.ThemTangCa(tc, DSDK);
                        if (rs.Success)
                        {
                            if (capnhat != null)
                                capnhat(loaihanhdong, tc);
                            MessageBox.Show("Thêm thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            LoadForm();
                        }
                        else
                            MessageBox.Show("Thêm thất bại!!!\r\n" + rs.Exceptions[rs.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case LoaiHanhDong.CapNhat:
                        DialogResult rd = System.Windows.Forms.DialogResult.No;
                        if (!CheckDateValidated())
                        {
                            rd = MessageBox.Show("Ngày bắt đầu và ngày kết thúc đã chỉnh sửa có thể làm mất thông tin đăng ký của nhân viên\r\nBạn có chắc chắn cập nhật không?", "Cảnh báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                        }
                        if (rd == DialogResult.Yes)
                        {
                            List<DKTangCa> ds = DSDK.FindAll(s => s.NgayDangKy < dtiNgayBatDau.Value || s.NgayDangKy > dtiNgayKetThuc.Value).ToList<DKTangCa>();

                            foreach (var d in ds)
                            {
                                DSDK.Remove(d);
                            }
                        }
                            TangCa tccn = LayThongTinForm();
                            ActionResult rscn = manager.CapNhatTangCa(tccn, DSDK);
                            if (rscn.Success)
                            {
                                if (capnhat != null)
                                    capnhat(loaihanhdong, tccn);
                                MessageBox.Show("Cập nhật thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Close();
                            }
                            else
                                MessageBox.Show("Cập nhật thất bại!!!\r\n" + rscn.Exceptions[rscn.Exceptions.Count - 1].Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
                        break;
                }
            }
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            LoadForm();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void thêmĐăngKýToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmDangKyTangCa frm = new frmDangKyTangCa(dtiNgayBatDau.Value, dtiNgayKetThuc.Value, new CapNhatDKTangCa(CapNhatDSDKTC), DSDK,txtMaTangCa.Text);
            frm.ShowDialog();
        }

        void CapNhatDSDKTC(List<DKTangCa> ds)
        {
            ds.Sort(delegate(DKTangCa dk1, DKTangCa dk2)
            {
                return dk1.NgayDangKy.CompareTo(dk2.NgayDangKy);
            });
            dgvDSDangKy.DataSource = new BindingListView<DKTangCa>(ds);
            lblTongSoDong.Text = "Tổng số dòng: " + ds.Count;
        }

        private void xóaĐăngKýToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dgvDSDangKy.SelectedRows.Count > 0)
            {
                DKTangCa dk = DSDK.Find(s => s.NgayDangKy == Convert.ToDateTime(dgvDSDangKy.SelectedRows[0].Cells["NgayDangKy"].Value)
                                        && s.MaNhanVien == Convert.ToString(dgvDSDangKy.SelectedRows[0].Cells["MaNhanVien"].Value));
                if (dk != null)
                {
                    
                    dgvDSDangKy.Rows.Remove(dgvDSDangKy.SelectedRows[0]);
                    DSDK.Remove(dk);
                    lblTongSoDong.Text = "Tổng số dòng: " + DSDK.Count;
                }
            }
            else
                MessageBox.Show("Bạn cần chọn 1 thông tin đăng ký để xóa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
}
